home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / CONFIG.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  11KB  |  480 lines

  1. /* Stuff heavily dependent on the configuration info in config.h */
  2.  
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "proc.h"
  7. #include "cmdparse.h"
  8. #include "config.h"
  9. #include "daemon.h"
  10. #include "timer.h"
  11. #include "iface.h"
  12. #include "usock.h"
  13. #include "kiss.h"
  14. #include "enet.h"
  15. #include "ax25.h"
  16. #include "netrom.h"
  17. #include "ip.h"
  18. #include "tcp.h"
  19. #include "udp.h"
  20. #include "commands.h"
  21.  
  22. static void showtrace __ARGS((struct iface *ifp));
  23. static int dosock __ARGS((int argc,char *argv[],void *p));
  24. static int dostart __ARGS((int argc,char *argv[],void *p));
  25. static int dostop __ARGS((int argc,char *argv[],void *p));
  26. static int dotrace __ARGS((int argc,char *argv[],void *p));
  27.  
  28. unsigned Nsessions = NSESSIONS;
  29. int32 Heapsize = HEAPSIZE * (long)1024;
  30.  
  31. /* daemons to be run at startup time */
  32. struct daemon Daemons[] = {
  33.     "killer",    200,    killer,
  34.     "timer",    512,    timerproc,
  35.     "network",    1024,    network,
  36.     "keyboard",    250,    keyboard,
  37.     NULLCHAR,    0,    NULLVFP
  38. };
  39.  
  40. /* Command lookup and branch tables */
  41.  
  42. struct cmds Cmds[] = {
  43.     /* The "go" command must be first */
  44.     "",        go,        0, 0, NULLCHAR,
  45.     "!",        doshell,    0, 0, NULLCHAR,
  46.     "abort",    doabort,    0, 0, NULLCHAR,
  47. #if    (defined(MAC) && defined(APPLETALK))
  48.     "applestat",    doatstat,    0,    0, NULLCHAR,
  49. #endif
  50. #if    (defined(AX25) || defined(ETHER) || defined(APPLETALK))
  51.     "arp",        doarp,        0, 0, NULLCHAR,
  52. #endif
  53. #ifdef    ASY
  54.     "asystat",    doasystat,    0, 0, NULLCHAR,
  55. #endif
  56. #ifdef    AX25
  57.     "ax25",        doax25,        0, 0, NULLCHAR,
  58. #endif    
  59.     "attach",    doattach,    0, 2,
  60.         "attach <hardware> <hw specific options>",
  61. /* This one is out of alpabetical order to allow abbreviation to "c" */
  62. #ifdef    AX25
  63.     "connect",    doconnect,    1024, 3,"connect <interface> <callsign>",
  64. #endif
  65. #ifndef UNIX    /* BSD or SYS5 */
  66.     "cd",        docd,        0, 0, NULLCHAR,
  67. #endif
  68.     "close",    doclose,    0, 0, NULLCHAR,
  69.     "disconnect",    doclose,    0, 0, NULLCHAR,
  70.     "dir",        dodir,        0, 0, NULLCHAR, /* note sequence */
  71.     "delete",    dodelete,    0, 2, "delete <file>",
  72.     "domain",    dodomain,    0, 0, NULLCHAR,
  73. #ifdef    HS
  74.     "hs",        dohs,        0, 0, NULLCHAR,
  75. #endif
  76. #ifdef    EAGLE
  77.     "eaglestat",    doegstat,    0, 0, NULLCHAR,
  78. #endif
  79.     "echo",        doecho,        0, 0, NULLCHAR,
  80.     "eol",        doeol,        0, 0, NULLCHAR,
  81. #ifndef    MSDOS
  82.     "escape",    doescape,    0, 0, NULLCHAR,
  83. #endif
  84. #ifdef    PC_EC
  85.     "etherstat",    doetherstat,    0, 0, NULLCHAR,
  86. #endif
  87.     "exit",        doexit,        0, 0, NULLCHAR,
  88.     "finger",    dofinger,    1024, 0, NULLCHAR,
  89.     "forward",    doforward,    0, 0, NULLCHAR,
  90.     "ftp",        doftp,        2048, 2, "ftp <address>",
  91. #ifdef HAPN
  92.     "hapnstat",    dohapnstat,    0, 0, NULLCHAR,
  93. #endif
  94.     "help",        dohelp,        0, 0, NULLCHAR,
  95.     "hostname",    dohostname,    0, 0, NULLCHAR,
  96.     "icmp",        doicmp,        0, 0, NULLCHAR,
  97.     "ip",        doip,        0, 0, NULLCHAR,
  98.     "kick",        dokick,        0, 0, NULLCHAR,
  99.     "log",        dolog,        0, 0, NULLCHAR,
  100. #ifdef    AX25
  101.     "mbox",        dombox,        0, 0, NULLCHAR,
  102. #endif
  103.     "memstat",    memstat,    0, 0, NULLCHAR,
  104. #ifdef    AX25
  105.     "mode",        domode,        0, 2, "mode <interface>",
  106. #endif
  107. #ifdef    NETROM
  108.     "netrom",    donetrom,    0, 0, NULLCHAR,
  109. #ifdef    NRS
  110.     "nrstat",    donrstat,    0, 0, NULLCHAR,
  111. #endif    /* NRS */
  112. #endif    /* NETROM */
  113.     "param",    doparam,    0, 2, "param <interface>",
  114.     "ping",        doping,        512, 2, "ping <host> [<length> <interval>]",
  115.     "ps",        ps,        0, 0, NULLCHAR,
  116. #ifndef UNIX /* BSD or SYS5 */
  117.     "pwd",        docd,        0, 0, NULLCHAR,
  118. #endif
  119.     "record",    dorecord,    0, 0, NULLCHAR,
  120.     "remote",    doremote,    0, 3, "remote [-p port] [-k key] [-a kickaddr] <address> exit|reset|kick",
  121.     "rename",    dorename,    0, 3, "rename <oldfile> <newfile>",
  122.     "reset",    doreset,    0, 0, NULLCHAR,
  123.     "route",    doroute,    0, 0, NULLCHAR,
  124.     "session",    dosession,    0, 0, NULLCHAR,
  125.     "shell",    doshell,    0, 0, NULLCHAR,
  126.     "smtp",        dosmtp,        0, 0, NULLCHAR,
  127.     "socket",    dosock,        0, 0, NULLCHAR,
  128. #ifdef    SERVERS
  129.     "start",    dostart,    0, 2, "start <servername>",    /**/
  130.     "stop",        dostop,        0, 2, "stop <servername>",
  131. #endif
  132.     "tcp",        dotcp,        0, 0, NULLCHAR,
  133.     "telnet",    dotelnet,    1024, 2, "telnet <address>",
  134. #ifdef    TRACE
  135.     "trace",    dotrace,    0, 0, NULLCHAR,
  136. #endif
  137.     "udp",        doudp,        0, 0, NULLCHAR,
  138.     "upload",    doupload,    0, 0, NULLCHAR,
  139.     "?",        dohelp,        0, 0, NULLCHAR,
  140.     NULLCHAR,    NULLFP,        0, 0,
  141.         "Unknown command; type \"?\" for list",
  142. };
  143.  
  144. /* List of supported hardware devices */
  145. struct cmds Attab[] = {
  146. #ifdef    PC_EC
  147.     /* 3-Com Ethernet interface */
  148.     "3c500", ec_attach, 0, 7, 
  149.     "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu>",
  150. #endif
  151. #ifdef    ASY
  152.     /* Ordinary PC asynchronous adaptor */
  153.     "asy", asy_attach, 0, 8, 
  154.     "attach asy <address> <vector> slip|ax25|nrs <label> <buffers> <mtu> <speed>",
  155. #endif
  156. #ifdef    PC100
  157.     /* PACCOMM PC-100 8530 HDLC adaptor */
  158.     "pc100", pc_attach, 0, 8, 
  159.     "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  160. #endif
  161. #ifdef    EAGLE
  162.     /* EAGLE RS-232C 8530 HDLC adaptor */
  163.     "eagle", eg_attach, 0, 8,
  164.     "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  165. #endif
  166. #ifdef    HAPN
  167.     /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  168.     "hapn", hapn_attach, 0, 8,
  169.     "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full",
  170. #endif
  171. #ifdef    APPLETALK
  172.     /* Macintosh AppleTalk */
  173.     "0", at_attach, 0, 7,
  174.     "attach 0 <protocol type> <device> arpa <label> <rx bufsize> <mtu>",
  175. #endif
  176. #ifdef NETROM
  177.     /* fake netrom interface */
  178.     "netrom", nr_attach, 0, 1,
  179.     "attach netrom",
  180. #endif
  181. #ifdef    PACKET
  182.     /* FTP Software's packet driver spec */
  183.     "packet", pk_attach, 0, 4,
  184.     "attach packet <int#> <label> <buffers> <mtu>",
  185. #endif
  186. #ifdef    HS
  187.     /* Special high speed driver for DRSI PCPA or Eagle cards */
  188.     "hs", hs_attach, 0, 7,
  189.     "attach hs <address> <vector> ax25 <label> <buffers> <mtu> <txdelay> <persistence>",
  190. #endif
  191.     NULLCHAR,
  192. };
  193.  
  194. /* Packet tracing stuff */
  195. #ifdef    TRACE
  196. #include "trace.h"
  197. /* Dummy structure for loopback tracing */
  198. struct iface Loopback = { NULLIF, "loopback" };
  199.  
  200. /* Protocol tracing function pointers */
  201. struct trace Tracef[] = {
  202. #ifdef    AX25
  203.     ax_forus,    ax25_dump,
  204. #else
  205.     NULLFP,        NULLVFP,
  206. #endif    /* AX25 */
  207.  
  208. #ifdef    ETHER
  209.     ether_forus,    ether_dump,
  210. #else
  211.     NULLFP,        NULLVFP,
  212. #endif    /* ETHER */
  213.  
  214.     NULLFP,        ip_dump,
  215.  
  216. #ifdef    APPLETALK
  217.     at_forus,    at_dump,
  218. #else
  219.     NULLFP,        NULLVFP,
  220. #endif    /* APPLETALK */
  221.  
  222. #ifdef    KISS
  223.     ki_forus,    ki_dump,
  224. #else
  225.     NULLFP,        NULLVFP,
  226. #endif    /* KISS */
  227.  
  228. };
  229.  
  230. static int
  231. dotrace(argc,argv,p)
  232. int argc;
  233. char *argv[];
  234. void *p;
  235. {
  236.     struct iface *ifp;
  237.  
  238.     if(argc < 2){
  239.         showtrace(&Loopback);
  240.         for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
  241.             showtrace(ifp);
  242.         return 0;
  243.     }
  244.     if(strcmp("loopback",argv[1]) == 0)
  245.         ifp = &Loopback;
  246.     else 
  247.         for(ifp = Ifaces; ifp != NULLIF; ifp = ifp->next)
  248.             if(strcmp(ifp->name,argv[1]) == 0)
  249.                 break;
  250.  
  251.     if(ifp == NULLIF){
  252.         printf("Interface %s unknown\n",argv[1]);
  253.         return 1;
  254.     }
  255.     if(argc >= 3)
  256.         ifp->trace = htoi(argv[2]);
  257.  
  258.     showtrace(ifp);
  259.     return 0;
  260. }
  261. /* Display the trace flags for a particular interface */
  262. static void
  263. showtrace(ifp)
  264. register struct iface *ifp;
  265. {
  266.     if(ifp == NULLIF)
  267.         return;
  268.     printf("%s:",ifp->name);
  269.     if(ifp->trace & (IF_TRACE_IN | IF_TRACE_OUT)){
  270.         if(ifp->trace & IF_TRACE_IN)
  271.             printf(" input");
  272.         if(ifp->trace & IF_TRACE_OUT)
  273.             printf(" output");
  274.  
  275.         if(ifp->trace & IF_TRACE_NOBC)
  276.             printf(" - no broadcasts");
  277.  
  278.         if(ifp->trace & IF_TRACE_HEX)
  279.             printf(" (Hex/ASCII dump)");
  280.         else if(ifp->trace & IF_TRACE_ASCII)
  281.             printf(" (ASCII dump)");
  282.         else
  283.             printf(" (headers only)");
  284.         printf("\n");
  285.     } else
  286.         printf(" tracing off\n");
  287. }
  288.  
  289. #else    /* TRACE */
  290.  
  291. /* Stubs for tracing disabled */
  292. struct trace Tracef[] = {
  293.     NULLFP        /* No tracing at all */
  294. };
  295.  
  296. dump(iface,direction,type,bp)
  297. struct iface *iface;
  298. int direction;
  299. unsigned type;
  300. struct mbuf *bp;
  301. {
  302. }
  303.  
  304. #endif    /* TRACE */
  305.  
  306.  
  307. #if    defined(AX25) && !defined(NETROM)
  308.  
  309. /* Stubs for when ax25 is configured wihtout net/rom */
  310. void
  311. nr_route(bp,iaxp)
  312. struct mbuf *bp;
  313. struct ax25_cb *iaxp;
  314. {
  315.     free_p(bp);
  316. }
  317. void
  318. nr_nodercv(iface,source,bp)
  319. struct iface *iface;
  320. struct ax25_addr *source;
  321. struct mbuf *bp;
  322. {
  323.     free_p(bp);
  324. }
  325. #endif    /* defined(AX25) && !defined(NETROM) */
  326.  
  327.  
  328. #ifdef    SERVERS
  329. /* "start" and "stop" subcommands */
  330. static struct cmds Startcmds[] = {
  331. #ifdef    AX25
  332.     "ax25",        ax25start,    256, 0, NULLCHAR,
  333. #endif
  334.     "discard",    dis1,        256, 0, NULLCHAR,
  335.     "echo",        echo1,        256, 0, NULLCHAR,
  336.     "finger",    finstart,    256, 0, NULLCHAR,
  337.     "ftp",        ftpstart,    256, 0, NULLCHAR,
  338. #ifdef    NETROM
  339.     "netrom",    nr4start,    256, 0, NULLCHAR,
  340. #endif
  341.     "smtp",        smtp1,        256, 0, NULLCHAR,
  342.     "telnet",    tnstart,    256, 0, NULLCHAR,
  343.     "remote",    rem1,        256, 0, NULLCHAR,
  344.     NULLCHAR,
  345. };
  346. static struct cmds Stopcmds[] = {
  347. #ifdef    AX25
  348.     "ax25",        ax250,        0, 0, NULLCHAR,
  349. #endif
  350.     "discard",    dis0,        0, 0, NULLCHAR,
  351.     "echo",        echo0,        0, 0, NULLCHAR,
  352.     "finger",    fin0,        0, 0, NULLCHAR,
  353.     "ftp",        ftp0,        0, 0, NULLCHAR,
  354. #ifdef    NETROM
  355.     "netrom",    nr40,        0, 0, NULLCHAR,
  356. #endif
  357.     "smtp",        smtp0,        0, 0, NULLCHAR,
  358.     "telnet",    tn0,        0, 0, NULLCHAR,
  359.     "remote",    rem0,        0, 0, NULLCHAR,
  360.     NULLCHAR,
  361.  
  362. };
  363. static int
  364. dostart(argc,argv,p)
  365. int argc;
  366. char *argv[];
  367. void *p;
  368. {
  369.     return subcmd(Startcmds,argc,argv,p);
  370. }
  371. static int
  372. dostop(argc,argv,p)
  373. int argc;
  374. char *argv[];
  375. void *p;
  376. {
  377.     return subcmd(Stopcmds,argc,argv,p);
  378. }
  379. #endif    /* SERVERS */
  380.  
  381. /* Various configuration-dependent functions */
  382.  
  383. /* Process packets in the Hopper */
  384. static void
  385. network(i,v1,v2)
  386. int i;
  387. void *v1;
  388. void *v2;
  389. {
  390.     struct mbuf *bp;
  391.     struct phdr phdr;
  392.     char i_state;
  393.  
  394. loop:    i_state = dirps();
  395.     while(Hopper == NULLBUF)
  396.         pwait(&Hopper);
  397.     restore(i_state);
  398.  
  399.     /* Process the input packet */
  400.     bp = dequeue(&Hopper);
  401.     pullup(&bp,(char *)&phdr,sizeof(phdr));
  402.     dump(phdr.iface,IF_TRACE_IN,phdr.type,bp);
  403.     switch(phdr.type){
  404. #ifdef    KISS
  405.     case TYPE_KISS:
  406.         kiss_recv(phdr.iface,bp);
  407.         break;
  408. #endif
  409. #ifdef    AX25
  410.     case TYPE_AX25:
  411.         ax_recv(phdr.iface,bp);
  412.         break;
  413. #endif
  414.     case TYPE_ETHER:
  415.         eproc(phdr.iface,bp);
  416.         break;
  417.     case TYPE_IP:
  418.         ip_route(bp,0);
  419.         break;
  420.     case TYPE_APPLETALK:
  421.     default:
  422.         free_p(bp);
  423.         break;
  424.     }
  425.     goto loop;
  426. }
  427.  
  428.  
  429. /* Socket status display command */
  430. static int
  431. dosock(argc,argv,p)
  432. int argc;
  433. char *argv[];
  434. void *p;
  435. {
  436.     register struct usock *up;
  437.     int s;
  438.  
  439.     if(argc < 2){
  440.         printf("S# Type    PCB      Owner\n");
  441.         for(s=0;s<Nusock;s++){
  442.             up = &Usock[s];
  443.             if(up->type == NOTUSED)
  444.                 continue;
  445.             printf("%2d %-8s%-8lx %lx (%s)\n",
  446.              s,Socktypes[up->type],ptol(up->cb.p),
  447.              ptol(up->owner),up->owner->name);
  448.         }
  449.         return 0;
  450.     }
  451.     s = atoi(argv[1]);
  452.     if(s < 0 || s >= Nusock){
  453.         printf("Number out of range\n");
  454.         return 1;
  455.     }
  456.     up = &Usock[s];
  457.     printf("%s %lx\n",Socktypes[up->type],ptol(up->cb.p));
  458.     if(up->cb.p == NULL)
  459.         return 0;
  460.     switch(up->type){
  461.     case TYPE_TCP:
  462.         st_tcp(up->cb.tcb);
  463.         break;
  464.     case TYPE_UDP:
  465.         st_udp(up->cb.udp,0);
  466.         break;
  467. #ifdef    AX25
  468.     case TYPE_AX25I:
  469.         st_ax25(up->cb.ax25);
  470.         break;
  471. #endif
  472. #ifdef    NETROM
  473.     case TYPE_NETROML4:
  474.         donrdump(up->cb.nr4);
  475.         break;
  476. #endif
  477.     }
  478.     return 0;    
  479. }
  480.